#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 传递界面显示的图片，后续使用队列
    connect(FFPlay::GetInstance(), &FFPlay::setImage, ui->showWidget, &DisplayWidget::setImage);
    // 传递进度条数据
    connect(FFPlay::GetInstance(), &FFPlay::setPlaySliderMaximum, ui->ctrlBarWidget, &CtrlBarWidget::setPlaySliderMaximum);
    connect(FFPlay::GetInstance(), &FFPlay::setPlaySliderValue, ui->ctrlBarWidget, &CtrlBarWidget::setPlaySliderValue);
    // 传递时间戳数据
    connect(FFPlay::GetInstance(), &FFPlay::setPlayTimeEdit, ui->ctrlBarWidget, &CtrlBarWidget::setPlayTimeEdit);
    connect(FFPlay::GetInstance(), &FFPlay::setTotalTimeEdit, ui->ctrlBarWidget, &CtrlBarWidget::setTotalTimeEdit);
    // 更换播放的文件
    connect(ui->playListContents->getListWidget(), &QListWidget::clicked, FFPlay::GetInstance(), &FFPlay::updatePlayUrl);
    // 清空页面数据
    connect(FFPlay::GetInstance(), &FFPlay::clear, ui->ctrlBarWidget, &CtrlBarWidget::initOrClear);
    connect(FFPlay::GetInstance(), &FFPlay::clear, ui->showWidget, &DisplayWidget::clear);
}

MainWindow::~MainWindow()
{
    delete ui;
}

MainWindow::initSignalsAndSlots()
{
    // 关联播放与暂停
    connect(ui->ctrlBarWidget, &CtrlBarWidget::sigPlayOrPause, this, &MainWindow::onPlayOrPause);
    // 关联停止
    connect(ui->ctrlBarWidget, &CtrlBarWidget::sigStop, this, &MainWindow::onStop);
}

int MainWindow::message_loop(void *arg)
{
    // 强转
    IjkMediaPlayer *mp = (IjkMediaPlayer*)arg;
    qDebug() << "message_loop into";
    // 线程循环处理消息
    while (1) {
        AVMessage msg;
        // 获取消息队列中的消息，如果没有消息，则阻塞获取
        int ret = mp->ijkmp_get_msg(&msg, 1);// 主要是处理 Java > C的消息，对我们这个项目来说，是处理 IjkMediaPlaer -> UI的消息
        // 返回值小于0，代表已经停止
        if(ret < 0)
        {
            break;
        }
        switch(msg.type) {
            case FFP_MSG_FLUSH:
            {
                qDebug() << __FUNCTION__ << ": FFP_MSG_FLUSH";
                break;
            }
            case FFP_MSG_PREPARED:
            {
                qDebug() << __FUNCTION__ << ": FFP_MSG_PREPARED";
                // 准备好了，就可以开始播放了
                mp->ijkmp_start();
                break;
            }
            default:
            {
                qDebug() << __FUNCTION__ << ": defalut" << msg.type;
                break;
            }
        }
        // 释放消息
        msg_free_obj(&msg);
        // 模拟线程执行耗时
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    // 结束
    return 0;
}

void MainWindow::onPlayOrPause()
{
    qDebug() << "onPlayOrPause call";
    // 返回值
    int ret = 0;
    // 如果没有创建过mp
    if(!mp_)
    {
        // 创建对象
        mp_ = new IjkMediaPlayer();
        // mp_内部创建内容
        ret = mp_->ijkmp_create(std::bind(&MainWindow::message_loop, this, std::placeholders::_1));
        if(ret < 0)
        {
            qDebug() << "ijkmp_create failed";
            // 释放mp内存
            delete mp_;
            mp_ = NULL;
            return ;
        }
        // 设置url——当前测试,后续获取文件列表中选择的文件
        mp_->ijkmp_set_data_source("src.mp4");
        // 准备播放中
        ret = mp_->ijkmp_prepare_async();
        if(ret < 0)
        {
            qDebug() << "ijkmp_prepare_async failed";
            // 释放mp内存
            delete mp_;
            mp_ = NULL;
            return ;
        }
    }
    // 已经准备好了，那么暂停或者恢复播放
    else
    {

    }
}

void MainWindow::onStop()
{
    qDebug() << "onStop call";
    // 如果已经打开了播放，才能停止
    if(mp_)
    {
        mp_->ijkmp_stop();
        mp_->ijkmp_destroy();
        delete mp_;
        mp_ = NULL;
    }
}
